package xml.mfattach;

import cn.hutool.core.util.XmlUtil;
import org.w3c.dom.*;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ParseMfbMenuXml {
    // 第一级的属性名和属性值
    // firstMap 和 secondMap 只有一个不会变，所以放在这里
    static Map firstMap = new HashMap();
    static Map secondMap = new HashMap();



    static List<Map> list = new ArrayList<>();

    public static void main(String[] args) {

        // 读XML文件
        Document document = XmlUtil.readXML(new File("D:/work/xikuan/biz/mfbgs/web/WEB-INF/config/init/xml/init-menu.xml"));

        Element element = document.getDocumentElement();

        // 拿第一级
        parseFirstElement(element);

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).toString());
        }

    }


    /**
     * 解析第一级
     * TagName： menu-config 没有属性，所以输出空
     * @param element
     */
    private static void parseFirstElement(Element element) {
        // 拿到当前element的所有的属性名和属性值
        NamedNodeMap namedNodeMap = element.getAttributes();
        // 遍历复制给firstMap存起来
        for (int i = 0; i < namedNodeMap.getLength(); i++) {
            Attr attr = (Attr) namedNodeMap.item(i);
            firstMap.put(attr.getName(), attr.getValue());
        }

//        System.out.println(firstMap.toString());
        // 拿到当前element的子节点集合
        NodeList nodeList = element.getChildNodes();
        Node childNode;
        // 有可能没有子节点,做一个非空判断
        if(nodeList.getLength() != 0){
            // 遍历当前element的所有的子节点
            for (int i = 0; i < nodeList.getLength(); i++) {
                childNode = nodeList.item(i);
                if(childNode.getNodeType() == Node.ELEMENT_NODE){
                    parseSecondElement((Element)childNode);
                }
            }
        }
    }

    /**
     * 解析第二级 item 只有一个属性 属性：（属性,值）： （name,顶级虚拟标签)
     * @param element
     */
    private static void parseSecondElement(Element element) {
        // 拿到当前element的所有的属性名和属性值
        NamedNodeMap namedNodeMap = element.getAttributes();
        // 遍历复制给firstMap存起来
        for (int i = 0; i < namedNodeMap.getLength(); i++) {
            Attr attr = (Attr) namedNodeMap.item(i);
            secondMap.put(attr.getName(), attr.getValue());
        }
//        System.out.println(secondMap.toString());


        // 拿到当前element的子节点集合
        NodeList nodeList = element.getChildNodes();
        Node childNode;
        // 有可能没有子节点,做一个非空判断
        if(nodeList.getLength() != 0){
            // 遍历当前element的所有的子节点
            for (int i = 0; i < nodeList.getLength(); i++) {
                childNode = nodeList.item(i);
                if(childNode.getNodeType() == Node.ELEMENT_NODE){
                    parseThirdElement((Element)childNode);
                }
            }
        }
    }

    /**
     * 解析第三级 item 三个属性 （属性,值）： （bill_type,DECALRE） (name,单据类型)  (parent_id,1)
     * @param element
     */
    private static void parseThirdElement(Element element) {
        Map thirdMap = new HashMap();
        // 拿到当前element的所有的属性名和属性值
        NamedNodeMap namedNodeMap = element.getAttributes();
        // 遍历复制给firstMap存起来
        for (int i = 0; i < namedNodeMap.getLength(); i++) {
            Attr attr = (Attr) namedNodeMap.item(i);
            thirdMap.put(attr.getName(), attr.getValue());
        }
        list.add(thirdMap);
//        System.out.println(thirdMap.toString());

        // 拿到当前element的子节点集合
        NodeList nodeList = element.getChildNodes();
        Node childNode;
        // 有可能没有子节点,做一个非空判断
        if(nodeList.getLength() != 0){
            // 遍历当前element的所有的子节点
            for (int i = 0; i < nodeList.getLength(); i++) {
                childNode = nodeList.item(i);
                if(childNode.getNodeType() == Node.ELEMENT_NODE){
                    parseFourthElement((Element)childNode);
                }
            }
        }
    }

    private static void parseFourthElement(Element element) {
        Map fourthMap = new HashMap();
        // 拿到当前element的所有的属性名和属性值
        NamedNodeMap namedNodeMap = element.getAttributes();
        // 遍历复制给firstMap存起来
        for (int i = 0; i < namedNodeMap.getLength(); i++) {
            Attr attr = (Attr) namedNodeMap.item(i);
            fourthMap.put(attr.getName(), attr.getValue());
        }
//        list.add(fourthMap);
//        System.out.println(fourthMap.toString());
    }

}



